#!/usr/bin/env python
# -*- coding: utf-8 -*-
# encoding  : utf-8

import conexion_cliente
import os.path, os
import string
from constants import *

#tamanio de mensaje
fraction_size = 1024

def send_confirmation():
    """ devuelve un string "0 OK \r\n" """
    res = str(code_ok) + " " + error_messages[code_ok] + eol
    
    return (res)



def quit():
    """ devuelve 0 """
    return (code_ok)



def get_metadata(dire, arch):
    """ devuelve una tupla (codigo de error, tamaño)
        en caso de error de IO devuelve la tupla
        (file_not_found,"")
    """
    #verificamos si dire viene con "/" al final o no.
    if dire[-1]=="/" :
        path = dire + arch
    else :
        path = dire + "/" + arch
    #intentamos abrir el archivo
    try :
        f = open(path, "r")
        tam = os.path.getsize(path)
    except IOError:
    #si ocurre un error de I/O enviamos el error
        return (file_not_found,"") 
    #armamos el string a devolver
    res=str(tam) + eol
    return (code_ok, res)



def get_file_listing (dire):
    """ devuelve una tupla (codigo de error, lista)
        donde codigo de error es siempre code_ok y lista
        una lista de strings con los nombres de archivos
        contenidos en el directorio dado por "dire"
    """
    
    #verificamos si dire viene con "/" al final o no.
    if dire[-1]!="/"   : dire+="/"
    #armamos la lista de archivos compartidos
    lista=[]
    for root, dirs, file_list in os.walk(dire):
        lista=lista + file_list
    res = ""
    for f in lista:
        if f[0]!="."  :
            res = res + f + eol
    #terminacion especial de la respuesta
    res += eol
    #la tupla que se devuelve
    return (code_ok, res)



def get_slice(dire, arch, off, lar):
    """devuelve una tupla de la forma 
       (codigo de error, arch,off,lar)
       en caso de error de IO devuelve
       (file_not_found,-1,-1,arch,"")
       en caso de pasaje de argumentos erroneos
       (bad_offset,-1,-1,"")
       si todo fue bien
       (code_ok,new_off,new_lar,arch,res)
       donde new_off es el punto donde apartir
       de ahi se dejo de leer, new_lar lo que 
       queda por leer y res el string que almacena
        lo leido
    """
    #verificamos si dire viene con "/" al final o no.
    if dire[-1]=="/" :
        path = dire + arch
    else :
          path = dire + "/" + arch
    #intentamos abrir y leer de arch
    try :
        f = open(path, "r")
        tam = os.path.getsize(path)
    #si hubo un error de I/O lo capturamos y devolvemos error
    except IOError:
        return ( file_not_found, -1, -1, arch, "")
    #verificamos que no haya problemas con el offset y largo
    ol = int(off) + int(lar)
    s = int(tam)
    if (ol > s or int(off) >= s): return (bad_offset,-1 ,-1 ,arch , "" )

    
    #indexamos el archivo
    f.seek(int(off))
    res = ""
    #obtenemos un pedazo
    if int(lar) > fraction_size:
         data = f.read(fraction_size)
         res += str(fraction_size) + " " + data + eol
         new_off=int(off)+fraction_size
         new_lar=int(lar)-fraction_size
    
    elif int(lar) <= fraction_size :
        data = f.read(int(lar))
        res += lar + " " + data + eol
        res += "0 " + eol
        new_off= int(lar)
        new_lar= 0
    #la tupla que se devuelve
    return (code_ok, new_off, new_lar, arch, res) 
